{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Домашнее задание по уроку «Случайные события. Случайные величины»\n",
    "\n",
    "Смоделировать игру против лотерейного автомата типа “777”. Игрок платит 1 руб., после чего выпадает случайное целое число, равномерно распределенное от 0 до 999. При некоторых значениях числа игрок получает выигрыш (см. справа)\n",
    "\n",
    "Выгодна ли игра игроку?\n",
    "\n",
    "Сколько в среднем приобретает или теряет игрок за одну игру?\n",
    "\n",
    "777: 200 руб.  \n",
    "999: 100 руб.  \n",
    "555: 50 руб.  \n",
    "333: 15 руб.  \n",
    "111: 10 руб.  \n",
    "x77: 5 руб.  \n",
    "xx7: 3 руб.  \n",
    "x00: 2 руб.  \n",
    "xx0: 1 руб.  \n",
    "\n",
    "x – любая цифра\n",
    "\n",
    "Дополнительное задание повышенной сложности. Теоретически рассчитать средний выигрыш (проигрыш) и сравнить с результатами моделирования"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from decimal import Decimal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_money_prize_type_777() -> int:\n",
    "    \"\"\"\n",
    "    Функция для определения суммы выигрыша в лоторейном автомате типа 777.\n",
    "    \n",
    "    Результат: сумма выигрыша, тип int \n",
    "    \"\"\"\n",
    "    \n",
    "    number = np.random.randint(0, 1000)\n",
    "        \n",
    "    if number == 777:\n",
    "        return 200 \n",
    "    elif number == 999:\n",
    "        return 100\n",
    "    elif number == 555:\n",
    "        return 50\n",
    "    elif number == 333:\n",
    "        return 15  \n",
    "    elif number == 111:\n",
    "        return 10\n",
    "    elif number%100 == 77:\n",
    "        return 5\n",
    "    elif number%10 == 7:\n",
    "        return 3\n",
    "    elif number%100 == 0:\n",
    "        return 2\n",
    "    elif number%10 == 0:\n",
    "        return 1\n",
    "    else:\n",
    "        return 0  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "play_count = 10000000\n",
    "win_moneys = 0\n",
    "lose_moneys = 0\n",
    "\n",
    "for _ in range(0, play_count):\n",
    "    lose_moneys += 1\n",
    "    win_moneys += get_money_prize_type_777()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8007059"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Средний размер выигрыша за одну игру\n",
    "win_moneys/play_count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Средний размер проигрыша за одну игру\n",
    "lose_moneys/play_count"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Рассчитаем теоретический размер проигрыша за одну игру.\n",
    "\n",
    "Для начала нам нужно посчитать число выигрышных комбинаций и их вероятность.\n",
    "\n",
    "777 - 1 комбинация из 1000 (вероятность попадания 0.001)\n",
    "\n",
    "999 - 1 комбинация из 1000 (вероятность попадания 0.001)\n",
    "\n",
    "555 - 1 комбинация из 1000 (вероятность попадания 0.001)\n",
    "\n",
    "333 - 1 комбинация из 1000 (вероятность попадания 0.001)\n",
    "\n",
    "333 - 1 комбинация из 1000 (вероятность попадания 0.001)\n",
    "\n",
    "x77 - 9 комбинаций из 1000 (вычитаем из общего количества комбинаций 10 одну комбинацию в виде 777, вероятность попадания 0,009)\n",
    "\n",
    "xx7 - 90 комбинации из 1000 ($\\overline{A}_{10}^2 - 10 = 10^2 - 10 = 90$, используем формулу размещения с повторением и вычитаем 10 комбинаций типа x77) (вероятность попадания 0.09)\n",
    "\n",
    "x00 - 10 комбинаций из 1000 (вероятность попадания 0.01)\n",
    "\n",
    "xx0 - 90 комбинаций из 1000 ($\\overline{A}_{10}^2 - 10 = 10^2 - 10 = 90$, используем формулу размещения с повторением и вычитаем 10 комбинаций типа x00, вероятность попадания 0.09)\n",
    "\n",
    "По формуле математического ожидания случайной величины получаем рассчетное среднее значение выигрыша:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Decimal('0.800')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(Decimal('0.001')*200 + \n",
    " Decimal('0.001')*100 + \n",
    " Decimal('0.001')*50 + \n",
    " Decimal('0.001')*15 + \n",
    " Decimal('0.001')*10 +\n",
    " Decimal('0.009')*5 + \n",
    " Decimal('0.09')*3 +\n",
    " Decimal('0.01')*2 + \n",
    " Decimal('0.09')*1\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Средний выигрыш за одну игру по методу Монте-Карло - 0.8007059\n",
    "\n",
    "Теоретический средний выигрыш - 0.800\n",
    "\n",
    "Теоретический размер проигрыша будет 1, так как в каждой игре человек тратит постоянную сумму."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
